using System;
using System.IO;
using System.Resources;
using System.Text;
using System.Reflection;
using System.Web;
using System.Web.Caching;
using System.Net.Mail;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Serialization;
using newtelligence.DasBlog.Runtime;
using newtelligence.DasBlog.Util;
using newtelligence.DasBlog.Web.Core;
using System.Web.Security;

namespace newtelligence.DasBlog.Web
{
	/// <summary>
	///		Summary description for EditConfigBox.
	/// </summary>
	public partial class EditConfigBox : UserControl
	{
		private const string passwordPlaceHolder = "########";
		protected CheckBox logIngnoredEmails;
		protected System.Web.UI.WebControls.CheckBox checkMovableTypeBlacklist;
		protected ResourceManager resmgr;

		// comment moderation controls
		
		// comment html/link controls
		protected System.Web.UI.WebControls.TextBox textAllowedTags;

		//comment Gravatar support controls

		// comment supression system
		protected System.Web.UI.WebControls.Label labelDaysCommentsHow;

		// supress email address because of spam

		protected const string SPAM_OPTION_DELETE = "DELETE";
		protected const string SPAM_OPTION_SAVE = "SAVE";

		public PingServiceCollection PingServiceCollection
		{
			get
			{
				PingServiceCollection pingServices = (PingServiceCollection) System.Web.Hosting.HostingEnvironment.Cache["PingServices"];
				if (pingServices == null)
				{
					pingServices = GetPingServiceInfo();
				}
				return pingServices;
			}
		}

		protected void Page_Load(object sender, EventArgs e)
		{
			if (Roles.IsUserInRole("admin") == false)
			{
				Response.Redirect("~/FormatPage.aspx?path=SiteConfig/accessdenied.format.html");
			}

			this.ID = "EditConfigBox";

			if (!IsPostBack)
			{
				SharedBasePage requestPage = Page as SharedBasePage;
				SiteConfig siteConfig = requestPage.SiteConfig;
				textContact.Text = siteConfig.Contact;
				textCopyright.Text = siteConfig.Copyright;
				textPassword.Text = passwordPlaceHolder;
				textConfirmPassword.Text = passwordPlaceHolder;
				textFrontPageCategory.Text = siteConfig.FrontPageCategory;
				textFrontPageDayCount.Text = siteConfig.FrontPageDayCount.ToString();
				textFrontPageEntryCount.Text = siteConfig.FrontPageEntryCount.ToString();
				textEntriesPerPage.Text = siteConfig.EntriesPerPage.ToString();
				textContentLookaheadDays.Text = siteConfig.ContentLookaheadDays.ToString();
				textMainMaxDaysInRss.Text = siteConfig.RssDayCount.ToString();
				textMainMaxEntriesInRss.Text = siteConfig.RssMainEntryCount.ToString();
				textOtherMaxEntriesInRss.Text = siteConfig.RssEntryCount.ToString();
				checkAlwaysIncludeContentInRSS.Checked = siteConfig.AlwaysIncludeContentInRSS;
				checkEnableRSSItemFooter.Checked = siteConfig.EnableRssItemFooters;
				textRSSItemFooter.Text = siteConfig.RssItemFooter;
				checkPop3Enabled.Checked = siteConfig.EnablePop3;
				textPop3Interval.Text = siteConfig.Pop3Interval.ToString();
				textPop3Server.Text = siteConfig.Pop3Server;
				textPop3SubjectPrefix.Text = siteConfig.Pop3SubjectPrefix;
				textPop3Username.Text = siteConfig.Pop3Username;
				textPop3Password.Text = passwordPlaceHolder;
				textPop3PasswordRepeat.Text = passwordPlaceHolder;
				textRoot.Text = siteConfig.Root;
				textSmtpServer.Text = siteConfig.SmtpServer;
				textSmtpPort.Text = siteConfig.SmtpPort.ToString();
				checkUseSSLForSMTP.Checked = siteConfig.UseSSLForSMTP;
				textNotificationEmailAddress.Text = siteConfig.NotificationEMailAddress;
				textSubtitle.Text = siteConfig.Subtitle;
				textSmtpServer.Text = siteConfig.SmtpServer;
				checkEnableCoComment.Checked = siteConfig.EnableCoComment;
				checkComments.Checked = siteConfig.SendCommentsByEmail;
				checkPingbacks.Checked = siteConfig.SendPingbacksByEmail;
				checkReferrals.Checked = siteConfig.SendReferralsByEmail;
				checkPosts.Checked = siteConfig.SendPostsByEmail;
				checkTrackbacks.Checked = siteConfig.SendTrackbacksByEmail;
				checkShowCommentCounters.Checked = siteConfig.ShowCommentCount;
				checkEnableAutoPingback.Checked = siteConfig.EnableAutoPingback;
				checkEnableBloggerApi.Checked = siteConfig.EnableBloggerApi;
				checkEnableComments.Checked = siteConfig.EnableComments;
				checkEnableCommentApi.Checked = siteConfig.EnableCommentApi;
				checkShowCommentsWhenViewingEntry.Checked = siteConfig.ShowCommentsWhenViewingEntry;
				checkEnableConfigEditService.Checked = siteConfig.EnableConfigEditService;
				checkEnableEditService.Checked = siteConfig.EnableEditService;
				checkEnableAutoSave.Checked = siteConfig.EnableAutoSave;
				checkEnablePingbackService.Checked = siteConfig.EnablePingbackService;
				checkEnableTrackbackService.Checked = siteConfig.EnableTrackbackService;
				checkEnableClickThrough.Checked = siteConfig.EnableClickThrough;
				checkEnableAggregatorBugging.Checked = siteConfig.EnableAggregatorBugging;
				checkXssEnabled.Checked = siteConfig.EnableXSSUpstream;
				textXssEndpoint.Text = siteConfig.XSSUpstreamEndpoint;
				textXssInterval.Text = siteConfig.XSSUpstreamInterval.ToString();
				textXssPassword.Text = passwordPlaceHolder;
				textXssPasswordRepeat.Text = passwordPlaceHolder;
				textXssUsername.Text = siteConfig.XSSUpstreamUsername;
				textXssRssFilename.Text = siteConfig.XSSRSSFilename;
				checkPop3InlineAttachedPictures.Checked = siteConfig.Pop3InlineAttachedPictures;
				textPop3AttachedPicturesPictureThumbnailHeight.Text = siteConfig.Pop3InlinedAttachedPicturesThumbHeight.ToString();
				mailDeletionAll.Checked = siteConfig.Pop3DeleteAllMessages;
				mailDeletionProcessed.Checked = ! siteConfig.Pop3DeleteAllMessages;
				logIgnoredEmails.Checked = siteConfig.Pop3LogIgnoredEmails;
				checkShowItemDescriptionInAggregatedViews.Checked = siteConfig.ShowItemDescriptionInAggregatedViews;
				checkEnableStartPageCaching.Checked = siteConfig.EnableStartPageCaching;
				checkEnableBlogrollDescription.Checked = siteConfig.EnableBlogrollDescription;
				checkEntryTitleAsLink.Checked = siteConfig.EntryTitleAsLink;
				checkEnableUrlRewriting.Checked = siteConfig.EnableUrlRewriting;
				checkEnableCrosspost.Checked = siteConfig.EnableCrossposts;
				checkCategoryAllEntries.Checked = siteConfig.CategoryAllEntries;
				checkReferralUrlBlacklist.Checked = siteConfig.EnableReferralUrlBlackList;
				textReferralBlacklist.Text = siteConfig.ReferralUrlBlackList;
				checkCaptchaEnabled.Checked = siteConfig.EnableCaptcha;
				checkReferralBlacklist404s.Checked = siteConfig.EnableReferralUrlBlackList404s;
				textRSSChannelImage.Text = siteConfig.ChannelImageUrl;
				//checkMovableTypeBlacklist.Checked = siteConfig.EnableMovableTypeBlackList;
				checkEnableTitlePermaLink.Checked = siteConfig.EnableTitlePermaLink;
				checkEnableTitlePermaLinkUnique.Checked = siteConfig.EnableTitlePermaLinkUnique;
				checkEnableTitlePermaLinkSpaces.Checked = siteConfig.EnableTitlePermaLinkSpaces;
				checkEnableEncryptLoginPassword.Checked = siteConfig.EncryptLoginPassword;
				checkEnableSmtpAuthentication.Checked = siteConfig.EnableSmtpAuthentication;
				textSmtpUsername.Text = siteConfig.SmtpUserName;
				textSmtpPassword.Text = passwordPlaceHolder;
				textRssLanguage.Text = siteConfig.RssLanguage;
				checkEnableSearchHighlight.Checked = siteConfig.EnableSearchHighlight;
				checkEnableEntryReferral.Checked = siteConfig.EnableEntryReferrals;
				textFeedBurnerName.Text = siteConfig.FeedBurnerName;
				checkUseFeedScheme.Checked = siteConfig.UseFeedSchemeForSyndication;
				checkLogBlockedReferrals.Checked = siteConfig.LogBlockedReferrals;

				checkSpamBlockingEnabled.Checked = siteConfig.EnableSpamBlockingService;
				textSpamBlockingApiKey.Text = siteConfig.SpamBlockingServiceApiKey;
				optionSpamHandling.SelectedValue = siteConfig.EnableSpamModeration ? SPAM_OPTION_SAVE : SPAM_OPTION_DELETE;

				// setup the checkbox list to select which tags to allow
				checkBoxListAllowedTags.DataSource = siteConfig.AllowedTags;
				checkBoxListAllowedTags.DataTextField = "Name";
				checkBoxListAllowedTags.DataValueField = "Name";


				// enable comment moderation 
				checkCommentsRequireApproval.Checked = siteConfig.CommentsRequireApproval;

				// allow html and comments
				checkAllowHtml.Checked = siteConfig.CommentsAllowHtml;

				// populate from config - Gravatar
				GravatarPopulateForm();


				// supress email address display
				checkDisableEmailDisplay.Checked = siteConfig.SupressEmailAddressDisplay;

				checkEnableCommentDays.Checked = siteConfig.EnableCommentDays;

				//if ( siteConfig.EnableCommentDays ) 
				//{
					if (siteConfig.DaysCommentsAllowed > 0)
					{
						textDaysCommentsAllowed.Text = siteConfig.DaysCommentsAllowed.ToString();
					}
				//} 
				//else 
				//{
				//	textDaysCommentsAllowed.Text = null;
				//}


				

				// supress email address display
				checkDisableEmailDisplay.Checked = siteConfig.SupressEmailAddressDisplay;

				checkEnableCommentDays.Checked = siteConfig.EnableCommentDays;

				//if ( siteConfig.EnableCommentDays ) 
				//{
					if (siteConfig.DaysCommentsAllowed > 0)
					{
						textDaysCommentsAllowed.Text = siteConfig.DaysCommentsAllowed.ToString();
					}
				//} 
				//else 
				//{
				//	textDaysCommentsAllowed.Text = null;
				//}

				// email daily report
				checkDailyReport.Text = resmgr.GetString("text_daily_activity_report");
				checkDailyReport.Checked = siteConfig.EnableDailyReportEmail;

				
				WindowsTimeZoneCollection timeZones = WindowsTimeZone.TimeZones;
				foreach (WindowsTimeZone tz in timeZones)
				{
					listTimeZones.Items.Add(new ListItem(tz.DisplayName, tz.ZoneIndex.ToString()));
				}
				listTimeZones.SelectedValue = siteConfig.DisplayTimeZoneIndex.ToString();
				checkUseUTC.Checked = !siteConfig.AdjustDisplayTimeZone;

				ThemeDictionary themes = BlogTheme.Load(System.Web.Hosting.HostingEnvironment.MapPath("~/themes"));
				foreach (BlogTheme theme in themes.Values)
				{
					listThemes.Items.Add(new ListItem(theme.Title, theme.Name));
				}
				listThemes.SelectedValue = siteConfig.Theme;
				textTitle.Text = siteConfig.Title;

				checkBoxListPingServices.DataSource = this.PingServiceCollection;
				checkBoxListPingServices.DataTextField = "Hyperlink";
				checkBoxListPingServices.DataValueField = "Endpoint";

				drpEntryEditControl.Items.Clear();
				foreach(string potentialAssembly in Directory.GetFiles(HttpRuntime.BinDirectory,"*.dll"))
				{
					try
					{
						Assembly a = Assembly.LoadFrom(potentialAssembly);
						foreach(Type potentialType in a.GetTypes())
						{
							if (potentialType.BaseType == typeof(EditControlAdapter))
							{
								drpEntryEditControl.Items.Add(new ListItem(potentialType.Name,potentialType.AssemblyQualifiedName));
							}
						}
					}
					catch (Exception)
					{
						//swallow
					}
				}

				//Reasonable default
				if (siteConfig.EntryEditControl == null || siteConfig.EntryEditControl.Trim().Length == 0)
				{
					siteConfig.EntryEditControl = typeof(FreeTextBoxAdapter).AssemblyQualifiedName;
				}
				DataBind();
 
                ListItem li = drpEntryEditControl.Items.FindByValue(siteConfig.EntryEditControl);
                if (li != null)
                {
                    li.Selected = true;
                }
                else
                {
                    drpEntryEditControl.SelectedIndex = 0;
                }


				foreach (PingService ps in siteConfig.PingServices)
				{
					checkBoxListPingServices.Items.FindByValue(ps.Endpoint).Selected = true;
				}

				foreach (ValidTag tag in siteConfig.AllowedTags)
				{
					checkBoxListAllowedTags.Items.FindByValue(tag.Name).Selected = tag.IsAllowed;
				}

                //check for Smtp permission
                if (System.Security.SecurityManager.IsGranted(new SmtpPermission(SmtpAccess.ConnectToUnrestrictedPort)))
                {
                    phSmtpTrustWarning.Visible = false;
                }
                else
                {
                    phSmtpTrustWarning.Visible = true;
                }

                //check for Socket permission
                System.Net.SocketPermission sp;
                if (String.IsNullOrEmpty(this.textPop3Server.Text))
                {
                    sp = new System.Net.SocketPermission(System.Security.Permissions.PermissionState.Unrestricted);
                }
                else
                {
                    sp = new System.Net.SocketPermission(System.Net.NetworkAccess.Connect, System.Net.TransportType.Tcp, this.textPop3Server.Text, 110);
                }

                if (System.Security.SecurityManager.IsGranted(sp))
                {
                    phPop3TrustWarning.Visible = false;
                }
                else
                {
                    phPop3TrustWarning.Visible = true;

                }

			} // end if !postback

            //enable list controls that may have been enabled client-side
            //in 2.0 if they are not enable we won't get there postback data
            checkBoxListAllowedTags.Enabled = true;
            dropGravatarRating.Enabled = true;

		}

		#region Web Form Designer generated code

		protected override void OnInit(EventArgs e)
		{
			//
			// CODEGEN: This call is required by the ASP.NET Web Form Designer.
			//
			InitializeComponent();
			base.OnInit(e);
			optionSpamHandling.Items.AddRange(new ListItem[]{
				new ListItem(resmgr.GetString("text_save_spam"), SPAM_OPTION_SAVE),
				new ListItem(resmgr.GetString("text_delete_spam"), SPAM_OPTION_DELETE)
															});
	}

	/// <summary>
	///		Required method for Designer support - do not modify
	///		the contents of this method with the code editor.
	/// </summary>
	private void InitializeComponent()
		{
		this.Init += new System.EventHandler(this.EditConfigBox_Init);

	}

		#endregion

        protected override void OnPreRender(EventArgs e)
        {
            // setup client side check validator
            CleanSettingsClient();


            // gravatar
            CleanGravatar();
            CleanGravatarClient();

            CleanAutoExpire();
            CleanAutoExipreClient();

            CleanHTMLComments();
            CleanHTMLCommentsClient(); 
        }

		private PingServiceCollection GetPingServiceInfo()
		{
			PingServiceCollection pingServiceCollection = new PingServiceCollection();
			string fullPath = SiteConfig.GetConfigPathFromCurrentContext() + "PingServices.xml";
			
			if (File.Exists(fullPath))
			{
				FileStream fileStream = newtelligence.DasBlog.Util.FileUtils.OpenForRead(fullPath);

				if ( fileStream != null )
				{
					try
					{
						XmlSerializer ser = new XmlSerializer(typeof(PingServiceCollection));
						StreamReader reader = new StreamReader(fileStream);
						pingServiceCollection = (PingServiceCollection)ser.Deserialize(reader);
						System.Web.Hosting.HostingEnvironment.Cache.Insert("PingServices", pingServiceCollection, new CacheDependency(fullPath));
					}
					catch(Exception e)
					{
						ErrorTrace.Trace(System.Diagnostics.TraceLevel.Error,e);
					}
					finally
					{
						fileStream.Close();
					}
				}
			}

			// add some defaults
			if (pingServiceCollection.Count == 0)
			{
				pingServiceCollection = PingService.GetDefaultPingServices();
			}

			return pingServiceCollection;
		}

		protected void buttonSave_Click(object sender, EventArgs e)
		{
			if (Page.IsValid)
			{
				SharedBasePage requestPage = Page as SharedBasePage;
				SiteConfig siteConfig = requestPage.SiteConfig;
				siteConfig.Contact = textContact.Text;
				siteConfig.Copyright = textCopyright.Text;
				siteConfig.FrontPageCategory = textFrontPageCategory.Text;
				siteConfig.FrontPageDayCount = int.Parse(textFrontPageDayCount.Text);
				siteConfig.FrontPageEntryCount = int.Parse(textFrontPageEntryCount.Text);
				siteConfig.EntriesPerPage = int.Parse(textEntriesPerPage.Text);
				try 
				{
					siteConfig.ContentLookaheadDays = int.Parse(textContentLookaheadDays.Text);
				}
				catch (FormatException)
				{
					siteConfig.ContentLookaheadDays = 0;
				}
				siteConfig.RssDayCount = int.Parse(textMainMaxDaysInRss.Text);
				siteConfig.RssMainEntryCount = int.Parse(textMainMaxEntriesInRss.Text);
				siteConfig.RssEntryCount = int.Parse(textOtherMaxEntriesInRss.Text);
				siteConfig.AlwaysIncludeContentInRSS = checkAlwaysIncludeContentInRSS.Checked;
				siteConfig.EnableRssItemFooters = checkEnableRSSItemFooter.Checked;
				siteConfig.RssItemFooter = textRSSItemFooter.Text;
				siteConfig.EnablePop3 = checkPop3Enabled.Checked;
				siteConfig.Pop3Interval = int.Parse(textPop3Interval.Text);
				siteConfig.Pop3Server = textPop3Server.Text;
				siteConfig.Pop3SubjectPrefix = textPop3SubjectPrefix.Text;
				siteConfig.Pop3Username = textPop3Username.Text;
				if (textPop3Password.Text.Length > 0 &&
					textPop3Password.Text != passwordPlaceHolder)
				{
					siteConfig.Pop3Password = textPop3Password.Text;
				}
				siteConfig.Pop3DeleteAllMessages = mailDeletionAll.Checked;
				siteConfig.Pop3LogIgnoredEmails = logIgnoredEmails.Checked;
				siteConfig.EnableXSSUpstream = checkXssEnabled.Checked;
				siteConfig.XSSUpstreamEndpoint = textXssEndpoint.Text;
				siteConfig.XSSUpstreamInterval = int.Parse(textXssInterval.Text);
				if (textXssPassword.Text.Length > 0 &&
					textXssPassword.Text != passwordPlaceHolder)
				{
					siteConfig.XSSUpstreamPassword = textXssPassword.Text;
				}
				siteConfig.XSSUpstreamUsername = textXssUsername.Text;
				siteConfig.XSSRSSFilename = textXssRssFilename.Text;

				siteConfig.Root = textRoot.Text;
				siteConfig.SmtpServer = textSmtpServer.Text;
				siteConfig.SmtpPort = int.Parse(textSmtpPort.Text);
				siteConfig.UseSSLForSMTP = checkUseSSLForSMTP.Checked;
				siteConfig.NotificationEMailAddress = textNotificationEmailAddress.Text;
				siteConfig.SendCommentsByEmail = checkComments.Checked;
				siteConfig.EnableCoComment = checkEnableCoComment.Checked;
				siteConfig.SendPingbacksByEmail = checkPingbacks.Checked;
				siteConfig.SendReferralsByEmail = checkReferrals.Checked;
				siteConfig.SendTrackbacksByEmail = checkTrackbacks.Checked;
				siteConfig.SendPostsByEmail = checkPosts.Checked;
				siteConfig.EnableAutoPingback = checkEnableAutoPingback.Checked;
				siteConfig.EnableBloggerApi = checkEnableBloggerApi.Checked;
				siteConfig.EnableComments = checkEnableComments.Checked;
				siteConfig.EnableCommentApi = checkEnableCommentApi.Checked;
				siteConfig.ShowCommentsWhenViewingEntry = checkShowCommentsWhenViewingEntry.Checked;
				siteConfig.EnableConfigEditService = checkEnableConfigEditService.Checked;
				siteConfig.EnableEditService = checkEnableEditService.Checked;
				siteConfig.EnableAutoSave = checkEnableAutoSave.Checked;
				siteConfig.EnableTrackbackService = checkEnableTrackbackService.Checked;
				siteConfig.EnablePingbackService = checkEnablePingbackService.Checked;
				siteConfig.EnableClickThrough = checkEnableClickThrough.Checked;
				siteConfig.EnableAggregatorBugging = checkEnableAggregatorBugging.Checked;
				siteConfig.Subtitle = textSubtitle.Text;
				siteConfig.Title = textTitle.Text;
				siteConfig.ShowCommentCount = checkShowCommentCounters.Checked;
				siteConfig.Pop3InlineAttachedPictures = checkPop3InlineAttachedPictures.Checked;
				siteConfig.Pop3InlinedAttachedPicturesThumbHeight = int.Parse(textPop3AttachedPicturesPictureThumbnailHeight.Text);
				siteConfig.ShowItemDescriptionInAggregatedViews = checkShowItemDescriptionInAggregatedViews.Checked;
				siteConfig.EnableStartPageCaching = checkEnableStartPageCaching.Checked;
				siteConfig.EnableBlogrollDescription = checkEnableBlogrollDescription.Checked;
				siteConfig.EnableUrlRewriting = checkEnableUrlRewriting.Checked;
				siteConfig.DisplayTimeZoneIndex = Convert.ToInt32(listTimeZones.SelectedValue);
				siteConfig.AdjustDisplayTimeZone = !checkUseUTC.Checked;
				siteConfig.EntryTitleAsLink = checkEntryTitleAsLink.Checked;
				siteConfig.EnableCrossposts = checkEnableCrosspost.Checked;
				if (textPassword.Text.Length > 0 &&
					textPassword.Text != passwordPlaceHolder)
				{
                    MembershipUser user = Membership.GetUser(requestPage.User.Identity.Name);
                    //FIX:  Membership.SiteSecurity.SetPassword(requestPage.User.Identity.Name, textPassword.Text);
				}
				siteConfig.CategoryAllEntries = checkCategoryAllEntries.Checked;
				requestPage.UserTheme = siteConfig.Theme = listThemes.SelectedValue;

				siteConfig.ReferralUrlBlackList = textReferralBlacklist.Text.TrimEnd(';');
				siteConfig.EnableReferralUrlBlackList = checkReferralUrlBlacklist.Checked;
				siteConfig.EnableCaptcha = checkCaptchaEnabled.Checked;
				siteConfig.EnableReferralUrlBlackList404s = checkReferralBlacklist404s.Checked;
				siteConfig.ChannelImageUrl = textRSSChannelImage.Text;
				//siteConfig.EnableMovableTypeBlackList = checkMovableTypeBlacklist.Checked;
				siteConfig.EnableTitlePermaLink = checkEnableTitlePermaLink.Checked;
				siteConfig.EnableTitlePermaLinkUnique = checkEnableTitlePermaLinkUnique.Checked;
				siteConfig.EnableTitlePermaLinkSpaces = checkEnableTitlePermaLinkSpaces.Checked;
				siteConfig.EncryptLoginPassword = checkEnableEncryptLoginPassword.Checked;
				siteConfig.EnableSmtpAuthentication = checkEnableSmtpAuthentication.Checked;
				siteConfig.SmtpUserName = textSmtpUsername.Text;
				if (textSmtpPassword.Text.Length > 0 &&
					textSmtpPassword.Text != passwordPlaceHolder)
				{
					siteConfig.SmtpPassword = textSmtpPassword.Text;
				}
				siteConfig.RssLanguage = textRssLanguage.Text;
				siteConfig.EnableSearchHighlight = checkEnableSearchHighlight.Checked;
				siteConfig.EnableEntryReferrals = checkEnableEntryReferral.Checked;

				siteConfig.FeedBurnerName = textFeedBurnerName.Text.Trim();
				siteConfig.UseFeedSchemeForSyndication = checkUseFeedScheme.Checked;
				siteConfig.LogBlockedReferrals = checkLogBlockedReferrals.Checked;
				siteConfig.EnableSpamBlockingService = checkSpamBlockingEnabled.Checked;
				siteConfig.SpamBlockingServiceApiKey = textSpamBlockingApiKey.Text;
				siteConfig.EnableSpamModeration = (optionSpamHandling.SelectedValue != SPAM_OPTION_DELETE);
				siteConfig.EnableCommentDays = checkEnableCommentDays.Checked;
				
				if (checkEnableCommentDays.Checked) 
				{
					try
					{
						int days = Convert.ToInt32(textDaysCommentsAllowed.Text);
						if (days > 0)
						{
							siteConfig.DaysCommentsAllowed = days;
						}
					}
					catch (FormatException)
					{
						siteConfig.DaysCommentsAllowed = 60;
					}
				} 
				else 
				{
				siteConfig.DaysCommentsAllowed = 60;
				}


				// comments approval
				siteConfig.CommentsRequireApproval = checkCommentsRequireApproval.Checked;

				// removed the ability to edit the html tags, which are allowed for now
					foreach( ListItem li in checkBoxListAllowedTags.Items ){
						ValidTag tag = siteConfig.AllowedTags[li.Value];
						if( tag != null ){
							tag.IsAllowed = li.Selected;
						}
					}					

				// comments allow html
				siteConfig.CommentsAllowHtml = checkAllowHtml.Checked;

				// comments allow Gravatar and alt path
				GravatarPopulateConfig();



				
				// supress email address display
				siteConfig.SupressEmailAddressDisplay = checkDisableEmailDisplay.Checked;


				// enable daily report email
				siteConfig.EnableDailyReportEmail = checkDailyReport.Checked;

				PingServiceCollection savePingServices = new PingServiceCollection();

				foreach (PingService pingService in this.PingServiceCollection)
				{
					if (checkBoxListPingServices.Items.FindByValue(pingService.Endpoint).Selected)
					{
						savePingServices.Add(pingService);
					}
				}

				siteConfig.PingServices = savePingServices;
				siteConfig.EntryEditControl = drpEntryEditControl.SelectedValue;

				SiteConfig.Save(siteConfig);

				/*
				if (siteConfig.EnableMovableTypeBlackList)
				{
					ReferralBlackListFactory.AddBlacklist(new MovableTypeBlacklist(), Path.Combine(SiteConfig.GetConfigPathFromCurrentContext(), "blacklist.txt"));
				}
				else
				{
					ReferralBlackListFactory.RemoveBlacklist(typeof(MovableTypeBlacklist));
				}
				*/

				if (siteConfig.EnableReferralUrlBlackList && siteConfig.ReferralUrlBlackList.Length != 0)
				{
					ReferralBlackListFactory.AddBlacklist(new ReferralUrlBlacklist(), siteConfig.ReferralUrlBlackList);
				}
				else
				{
					ReferralBlackListFactory.RemoveBlacklist(typeof(ReferralUrlBlacklist));
				}

				requestPage.Redirect(Page.Request.Url.AbsoluteUri);
			} 
			else 
			{

				// there were validation errors
				// save client states
				
				CleanGravatar();

				CleanAutoExpire();

				CleanHTMLComments();

				// and, possibly reset the clients
				// configDefaultGravatar();
				
			}
		}

		protected void EditConfigBox_Init(object sender, EventArgs e)
		{
			resmgr = ApplicationResourceTable.Get();
		}

		protected void buttonTestSMTP_Click(object sender, EventArgs e)
		{
			SiteConfig siteConfig = SiteConfig.GetSiteConfig();

			if (textSmtpServer.Text != "" & textNotificationEmailAddress.Text != "")
			{
				MailMessage emailMessage = new MailMessage();

				emailMessage.To.Add(textNotificationEmailAddress.Text);
				emailMessage.Subject = String.Format("dasBlog test message");
				emailMessage.Body = String.Format("This is a test message from dasBlog. If you are reading this then everything is working properly.");
                emailMessage.IsBodyHtml = false;
				emailMessage.BodyEncoding = Encoding.UTF8;
				emailMessage.From = new MailAddress(siteConfig.Contact);
				SendMailInfo sendMailInfo = new SendMailInfo(emailMessage, textSmtpServer.Text,
                    checkEnableSmtpAuthentication.Checked, checkUseSSLForSMTP.Checked, textSmtpUsername.Text, textSmtpPassword.Text, int.Parse(textSmtpPort.Text));

				try
				{
					sendMailInfo.SendMyMessage();
				}
				catch (Exception ex)
				{
					//RyanG: Decode the real reason the error occured by looking at the inner exceptions
					System.Text.StringBuilder exceptionMessage = new System.Text.StringBuilder();
					Exception lastException = ex;
					while (lastException != null) 
					{
						if (exceptionMessage.Length > 0)
							exceptionMessage.Append("; ");
						exceptionMessage.Append(lastException.Message);
						lastException = lastException.InnerException;
					}

					ILoggingDataService logService = LoggingDataServiceFactory.GetService(System.Web.Hosting.HostingEnvironment.MapPath(siteConfig.LogDir));
					logService.AddEvent(
						new EventDataItem(EventCodes.SmtpError, "", exceptionMessage.ToString()));

					Response.Redirect("FormatPage.aspx?path=SiteConfig/pageerror.format.html", true);
				}
			}
		}


		// beautify Config	
			

		// JS checkbox disabler
		private void CleanSettingsClient() 
		{

            if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "checkBoxScript"))
			{
			    // checkId is the client side id of the parent control for the controls to enable/disable
			    // checkTog is the array of controls to enable/disable ( "," separated string )
			    string scriptString = "<script type=\"text/javascript\" language=\"JavaScript\">\n";
			    scriptString += "function performCheck(checkID, checkTog)\n";
			    scriptString += "{\n";
			    scriptString += "	var srcs_ary = checkTog.split(\",\") \n";
			    scriptString += "	if(document.getElementById(checkID).checked)\n";
			    scriptString += "	{\n";
			    scriptString += "		for(i=0;i<srcs_ary.length;i++){\n";
			    scriptString +=	"		document.getElementById(srcs_ary[i]).disabled = false;\n";
			    scriptString += "		}\n";
			    scriptString += "	}\n";
			    scriptString += "	else {\n";
			    scriptString += "		for(i=0;i<srcs_ary.length;i++){\n";
			    scriptString +=	"		document.getElementById(srcs_ary[i]).disabled = true;\n";
			    scriptString += "		}\n";
			    scriptString += "	}\n";
			    scriptString += "}\n";
			    scriptString += "</script>";

				Page.ClientScript.RegisterClientScriptBlock(this.GetType(),"checkBoxScript", scriptString);
			}
		}

		// Auto Expire

		private void CleanAutoExpire() 
		{
			if (checkEnableCommentDays.Checked) 
			{
				textDaysCommentsAllowed.Enabled = true;

			}
			else 
			{
				textDaysCommentsAllowed.Enabled = false;
			}
		}



		private void CleanAutoExipreClient() 
		{
	
			// use control.ClientID to reference controls in javascript since the naming convention has changed between 1.1 and 2.0
			const string onClick = "javascript:performCheck('{0}', '{1}'); if(document.getElementById('{1}').value == ''){{document.getElementById('{1}').value = '60';}}";
			checkEnableCommentDays.Attributes.Add("onClick",string.Format(onClick, checkEnableCommentDays.ClientID, textDaysCommentsAllowed.ClientID));
		}



		// HTML Comments

		private void CleanHTMLComments() 
		{
			if (checkAllowHtml.Checked) 
			{
				checkBoxListAllowedTags.Enabled = true;
			}
			else 
			{
				checkBoxListAllowedTags.Enabled = false;
			}
		}

		private void CleanHTMLCommentsClient() 
		{	
			string allowHtmlList = "";
			
			for( int i = 0; i < checkBoxListAllowedTags.Items.Count; i++ )
			{
				
				if (i != 0) 
				{
					allowHtmlList += ",";
				}

				//HACK: this will break in 2.0, but I don't know of a better solution
				allowHtmlList +=  checkBoxListAllowedTags.ClientID + "_"+ i;
			}
				
			const string onClick = "javascript:performCheck('{0}', '{1}');";

			checkAllowHtml.Attributes.Add("onClick",String.Format(onClick, checkAllowHtml.ClientID, allowHtmlList));
		}

		// Gravatar

		private const string defaultGravatarSize = "80";
		


		private void CleanGravatar() 
		{
			if (checkEnableGravatar.Checked) 
			{
				textGravatarSize.Enabled = true;
				textNoGravatarPath.Enabled = true;
				textGravatarBorderColor.Enabled = true;
				dropGravatarRating.Enabled = true;

			} 
			else 
			{
				textGravatarSize.Enabled = false;
				textNoGravatarPath.Enabled = false;
				textGravatarBorderColor.Enabled = false;
				dropGravatarRating.Enabled = false;
			}

			
		}




		private void CleanGravatarClient() 
		{	
			const string OnClick = "javascript:performCheck('{0}', '{1},{2},{3},{4}');";

			// use control.clientId for client side access to controls
			checkEnableGravatar.Attributes.Add("onClick",String.Format( OnClick, checkEnableGravatar.ClientID,
				textGravatarSize.ClientID,
				textNoGravatarPath.ClientID,
				textGravatarBorderColor.ClientID,
				dropGravatarRating.ClientID
				));
		}


		private void GravatarPopulateForm()
		{
			SharedBasePage requestPage = Page as SharedBasePage;
			SiteConfig siteConfig = requestPage.SiteConfig;


			checkEnableGravatar.Checked = siteConfig.CommentsAllowGravatar;
				

			if (siteConfig.CommentsGravatarSize != null ) 
			{
				if (siteConfig.CommentsGravatarSize != "")
				{
				
					int gpix = Convert.ToInt32(siteConfig.CommentsGravatarSize);
					if (gpix > 0) 
					{
						textGravatarSize.Text = gpix.ToString();
					}
					else
					{
						textGravatarSize.Text = defaultGravatarSize;
					}
				}
			} 


			if (siteConfig.CommentsGravatarNoImgPath != null) 
			{
				textNoGravatarPath.Text = siteConfig.CommentsGravatarNoImgPath;
			}

			if (siteConfig.CommentsGravatarBorder != null) 
			{

				textGravatarBorderColor.Text = siteConfig.CommentsGravatarBorder;
			}

			if (siteConfig.CommentsGravatarRating != null)
			{
				dropGravatarRating.SelectedValue = siteConfig.CommentsGravatarRating;
			}
			
		}

		private void GravatarPopulateConfig() 
		{
			SharedBasePage requestPage = Page as SharedBasePage;
			SiteConfig siteConfig = requestPage.SiteConfig;

			siteConfig.CommentsAllowGravatar = checkEnableGravatar.Checked;
			siteConfig.CommentsGravatarNoImgPath = textNoGravatarPath.Text.Trim();
			siteConfig.CommentsGravatarBorder = textGravatarBorderColor.Text.Trim();
			siteConfig.CommentsGravatarRating = dropGravatarRating.SelectedValue;
			
			try
			{
				int gpix = Convert.ToInt32(textGravatarSize.Text.Trim());
				if (gpix > 0 && gpix <=80)
				{
					siteConfig.CommentsGravatarSize = gpix.ToString();
				} 
				else 
				{
					siteConfig.CommentsGravatarSize = defaultGravatarSize;
				}
			}
			catch (FormatException)
			{
				siteConfig.CommentsGravatarSize = "";
			}

		}

	}
}
